/*
 * Copyright (C) 2012 Caldia Apps.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.caldia.android.frameworkG1.fragment;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.os.IBinder;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

/**
 *
 * @author k-matsuda@caldia.org
 *
 */
public class TopFragment extends AbstractFragment {

	/**
	 * INVALID VALUE = -1
	 */
	public static final int INVALID_VALUE = -1;

	/**
	 * レイアウトリソースID
	 */
	private int mLayoutResId = INVALID_VALUE;

	/**
	 * ホームボタン表示フラグ
	 */
	private boolean showHomeAsUp;

	/**
	 * 画面タイトルリソースID
	 */
	private int mTitleId = INVALID_VALUE;

	/**
	 * 画面タイトル文字列
	 */
	private String mTitleString;

	/**
	 * メニューボタン表示フラグ
	 */
	private boolean mHasMenu;

	/**
	 * 画面のテーマリソースIDを取得する
	 *
	 * @return テーマID
	 */
	public int getThemeId() {
		return INVALID_VALUE;
	}

	/**
	 * イアウトリソースID設定
	 *
	 * @param id
	 *            リソースID
	 */
	protected void setLayoutResId(final int id) {
		mLayoutResId = id;
	}

	/**
	 * ソフトキーボード非表示
	 *
	 * @param windowToken
	 *            ソフトキーボードと関連しているWidowToken
	 */
	protected void hideKeybord(final IBinder windowToken) {
		final InputMethodManager inputMethodManager = (InputMethodManager) getActivity()
				.getSystemService(Context.INPUT_METHOD_SERVICE);
		inputMethodManager.hideSoftInputFromWindow(windowToken, 0);

	}

	/**
	 * ソフトキーボード非表示
	 *
	 * @param id
	 *            リソースID
	 */
	protected void hideKeybord(final int id) {
		final View view = findViewById(id);
		if (view != null) {
			hideKeybord(view.getWindowToken());
		}
	}

	/**
	 * View 取得
	 *
	 * @param id
	 *            リソースID
	 * @return View
	 */
	protected View findViewById(final int id) {
		final View v = getView();
		if (v != null) {
			return getView().findViewById(id);
		}
		return null;
	}

	/**
	 * EditText 取得
	 *
	 * @param id
	 *            リソースID
	 * @return EditText
	 */
	protected EditText getEditText(final int id) {
		final View view = findViewById(id);
		if (view != null && view instanceof EditText) {
			return (EditText) view;
		}
		return null;
	}

	/**
	 * WindowToken 取得
	 *
	 * @param id
	 *            リソースID
	 * @return WindowToken
	 */
	protected IBinder getWindowToken(final int id) {
		final View view = findViewById(id);
		if (view != null) {
			return view.getWindowToken();
		}
		return null;
	}

	/**
	 * リソースID取得
	 *
	 * @param resName
	 *            リソース名
	 * @return リソースID
	 */
	protected int getResId(final String resName) {
		final Resources res = getActivity().getResources();
		return res.getIdentifier(resName, "id", getActivity().getPackageName());
	}

	/**
	 * View 取得
	 *
	 * @param resName
	 *            リソース名
	 * @return View
	 */
	protected View findViewById(final String resName) {
		final int resId = getResId(resName);
		return findViewById(resId);
	}

	/**
	 * 戻る
	 */
	protected void finish() {
		// try {
		// getFragmentManager().popBackStack();
		// } catch (final IllegalStateException e) {

		try {
			final Activity activity = getActivity();
			if (activity != null) {
				activity.finish();
			}
		} catch (final Exception e2) {
			e2.printStackTrace();
		}

		// } catch (final Exception e) {
		// e.printStackTrace();
		// }
	}

	protected TextView getTextView(final int resId) {

		final View view = findViewById(resId);
		if (view != null && view instanceof TextView) {
			try {
				return TextView.class.cast(view);
			} catch (final ClassCastException e) {
//				CLog.wt(this, 0, "Error");
				e.printStackTrace();
			}
		}
		return null;

	}

	/**
	 * TextView 取得
	 *
	 * @param resName
	 *            リソース名
	 * @return TextView
	 */
	protected TextView getTextView(final String resName) {
		final int resId = getResId(resName);
		if (0 < resId) {
			return getTextView(resId);
		}
		return null;
	}

	protected int getId(final String resName, final String type) {
		final Resources res = getActivity().getResources();
		return res.getIdentifier(resName, type, getActivity().getPackageName());
	}

	protected void runOnUiThread(final Runnable action) {

		if (getActivity() != null) {
			getActivity().runOnUiThread(action);
		}
	}

	protected View infrate(final int resource, final ViewGroup root) {
		final LayoutInflater inflater = LayoutInflater.from(getActivity());
		return inflater.inflate(resource, root);
	}

	@Override
	public View onCreateView(final LayoutInflater inflater,
			final ViewGroup container,
			final android.os.Bundle savedInstanceState) {

		if (mLayoutResId != INVALID_VALUE) {
			final View child = inflater.inflate(mLayoutResId, null);
			final LayoutParams params = new LayoutParams(
					LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
			child.setLayoutParams(params);
			return child;
		}
		return null;
	}

	/**
	 * ホームボタン表示フラグ設定
	 *
	 * @param showHomeAsUp
	 *            true を設定するとホームボタンを表示する
	 */
	public void setDisplayHomeAsUpEnabled(final boolean showHomeAsUp) {

		this.showHomeAsUp = showHomeAsUp;
	}

	/**
	 * ホームボタン表示フラグ取得
	 *
	 * @return true の場合はホームボタンを表示させるように実装する
	 */
	public boolean isDisplayHomeAsUpEnabled() {
		return showHomeAsUp;
	}

	/**
	 * 画面タイトルリソースIDを設定する
	 *
	 * @param resId
	 *            リソースID
	 */
	public void setTitle(final int resId) {
		mTitleId = resId;
	}

	/**
	 * 画面タイトル文字列を設定する
	 *
	 * @param title
	 *            タイトル文字列
	 */
	public void setTitle(final String title) {
		mTitleString = title;
	}

	/**
	 * 画面タイトルID取得
	 *
	 * @return リソースID
	 */
	public int getTitleId() {
		return mTitleId;
	}

	/**
	 * 画面タイトルテキスト取得
	 *
	 * @return タイトルテキスト
	 */
	public String getTitleString() {
		return mTitleString;
	}

	@Override
	public void setHasOptionsMenu(final boolean hasMenu) {
		super.setHasOptionsMenu(hasMenu);
		mHasMenu = hasMenu;
	}

	/**
	 * メニュー表示フラグ取得
	 *
	 * @return true の場合はメニューボタンを表示するように実装する
	 */
	public boolean isHasMenu() {
		return mHasMenu;
	}

	/**
	 * フラグメントの表示状態を設定する
	 *
	 * @param fragment
	 *            フラグメント
	 * @param visible
	 *            表示フラグ
	 */
	protected void setFragmentVisible(final AbstractFragment fragment,
			final boolean visible) {

		final FragmentTransaction tr = getFragmentManager().beginTransaction();
		if (visible) {
			tr.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
			tr.show(fragment);
		} else {
			tr.setTransition(FragmentTransaction.TRANSIT_NONE);
			tr.hide(fragment);
		}
		tr.commit();

	}
}
